/*
基于线程池实现的任务消费工具类, 支持初始化线程池后, 按照空闲情况从TaskManager的公共任务队列中取出任务执行
*/

#ifndef TASK_CONSUMER_H
#define TASK_CONSUMER_H

#include <string>
#include <vector>
#include <thread>
#include <queue>
#include <functional>
#include <mutex>
#include <condition_variable>
#include <atomic>
#include <memory>

#include "../includes/TaskManager.h"
#include "../includes/FileApi.h"

class TaskConsumer {
public:
    // 全局单例类
    static TaskConsumer& getInstance();
    ~TaskConsumer(); // 析构函数会自动等待所有任务完成并停止线程
    // 禁止拷贝和移动
    TaskConsumer(const TaskConsumer&) = delete;
    TaskConsumer& operator=(const TaskConsumer&) = delete;
    TaskConsumer(TaskConsumer&&) = delete;
    TaskConsumer& operator=(TaskConsumer&&) = delete;

public:
    // 添加一个可执行任务, 从TaskManager的任务队列获取
    // 返回 true 表示任务成功添加，false 可能表示线程池已停止
    bool add_task();

    // 获取当前空闲线程数量
    int idle_threads() const;

private:
    TaskConsumer(int num_threads = 10); // 构造函数接受线程数量

    // 工作线程的循环逻辑
    void worker_loop();

    // 执行任务的通用方法
    static void run(const std::string& task_str);

    // 执行任务的具体方法
    static void write(const TaskManager::WriteTask& task, TaskManager::WriteResponse& resp);
    static void cat(const TaskManager::CatTask& task, TaskManager::CatResponse& resp);
    static void touch(const TaskManager::TouchTask& task, TaskManager::TouchResponse& resp);
    static void rm(const TaskManager::RmTask& task, TaskManager::RmResponse& resp);
    static void ls(const TaskManager::LsTask& task, TaskManager::LsResponse& resp);

private:
    static TaskConsumer* instance_;

    // 线程池核心组件
    std::vector<std::thread> workers_;        // 存储工作线程
    std::queue<std::function<void()>> tasks_; // 任务队列

    mutable std::mutex queue_mutex_;          // 保护任务队列的互斥锁
    std::condition_variable condition_;       // 用于线程等待/通知的条件变量
    std::atomic<bool> stop_;                  // 原子布尔值，指示线程池是否停止
    std::atomic<int> idle_threads_;           // 原子整数，记录空闲线程数量
    const int total_threads_;                 // 总线程数量
};

#endif // TASK_CONSUMER